﻿using System;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Runtime.Serialization;

namespace RiskMan.DataClass.Models.Gilevskiy
{
    /// <summary>
    /// Данные по настроенным таймфреймам
    /// </summary>
    [Serializable]
    public class TimeFrameItem : INotifyPropertyChanged, ISerializable
    {
        #region private

        private int _timeFrame;
        private string _instrument;
        private string _comment;
        private int _lastNumberDeal;
        private Guid _guid;
        private ObservableCollection<CandleItem> _candleItems;

        #endregion

        #region public

        /// <summary>
        /// Последняя строка обработанная данным инструментом из таблицы всех сделок
        /// </summary>
        public int LastNumberDeal
        {
            get { return _lastNumberDeal; }
            set
            {
                if (_lastNumberDeal != value)
                {
                    _lastNumberDeal = value;
                    RaisePropertyChanged("LastNumberDeal");
                }
            }
        }

        /// <summary>
        /// Задаваемый таймфрейм, задается в минутах
        /// </summary>
        public int TimeFrame
        {
            get { return _timeFrame; }
            set
            {
                if (_timeFrame != value)
                {
                    _timeFrame = value;
                    RaisePropertyChanged("TimeFrame");
                }
            }
        }

        /// <summary>
        /// Инструмент
        /// </summary>
        public string Instrument
        {
            get { return _instrument; }
            set
            {
                if (_instrument != value)
                {
                    _instrument = value;
                    RaisePropertyChanged("Instrument");
                }
            }
        }

        /// <summary>
        /// Комментарий к таймфрейму
        /// </summary>
        public string Comment
        {
            get { return _comment; }
            set
            {
                if (_comment != value)
                {
                    _comment = value;
                    RaisePropertyChanged("Comment");
                }
            }
        }

        /// <summary>
        /// Коллекция свечей по заданному таймфрейму, выводить только последние 5 значений
        /// </summary>
        public ObservableCollection<CandleItem> CandleItems
        {
            get { return _candleItems; }
            set
            {
                if (_candleItems != value)
                {
                    _candleItems = value;
                    RaisePropertyChanged("CandleItems");
                }
            }
        }

        /// <summary>
        /// уникальный номер таймфрейм, чтоб не терялся при сортировке
        /// </summary>
        public Guid GuidItem
        {
            get { return _guid; }
            set
            {
                if (_guid != value)
                {
                    _guid = value;
                    RaisePropertyChanged("GuidItem");
                }
            }
        }

        #endregion

        public TimeFrameItem() { }

        #region event PropertyChangedEventHandler

        public event PropertyChangedEventHandler PropertyChanged;

        protected void RaisePropertyChanged(string propertyName)
        {
            var handler = PropertyChanged;
            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(propertyName));
            }
        }

        #endregion

        public TimeFrameItem(SerializationInfo info, StreamingContext context)
        {
            TimeFrame = info.GetInt32("TimeFrame");
            Comment = info.GetString("Comment");
            Instrument = info.GetString("Instrument");
        }

        public void GetObjectData(SerializationInfo info, StreamingContext context)
        {

            info.AddValue("TimeFrame", TimeFrame);
            info.AddValue("Comment", Comment);
            info.AddValue("Instrument", Instrument);

        }
    }
}
